#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

/**
 * int 32位
 * 最大值 2147483647 正数以0开头 (01111111111111111111111111111111)
 * 最大值 -2147483648 负数以1开头 (10000000000000000000000000000000)
 */
void int_scope(void);

/**
 * 整型数据
 * 支持十进制(默认), 十六进制(0X...), 八进制(0...)
 */
void int_system(void);

/**
 * 浮点型数据
 * float 精确到小数点后6位有效数 通常为32位 8位表示指数的值和符号 24位用于表示非指数部分(有效数或尾数)
 * double 精确到小数点后13位有效数 通常位64位 8位表示指数的值和符号 54位用于表示非指数部分(有效数或尾数)
 */
void float_system(void);

/**
 * 数字打印
 */
void number_print(void);

/**
 * 布尔值仅占一位, 比整型占用的位置小
 * 1 ture, 0 false
 */
void boolean(void);

void transplant(void);

void data_type_size(void);

int main(void)
{
    data_type_size();
    return 0;
}

void int_scope()
{
    printf("int value max: [%d], min: [%d]\n", INT32_MAX, INT32_MIN);
}

void int_system(void)
{
    int val_10 = 16; // 十进制
    int val_8 = 020; // 八进制 以0开头
    int val_16 = 0X10; // 十六进制 以0X开头
    printf("%d\n", val_10);
    printf("%d\n", val_8);
    printf("%d\n", val_16);
}

void float_system(void)
{
}

void number_print(void)
{
    // 整型
    char c = 'A';
    unsigned int un = 3000000000;
    short end = 300;
    long big = 65537L;
    long long verybig = 9223372036854775807L;

    printf("char '%%c', char val = %c, ASCII val = %d\n", c, c);
    printf("unsigned int '%%u', unsigned int val = %u, int val = %d\n", un, un);
    printf("short '%%hd', short int val = %hd\n", end);
    printf("long '%%ld', long int val = %ld\n", big);
    printf("long long '%%lld', long long val = %lld\n", verybig);

    // 浮点型
    float aboat = 32000.0F;
    double abet = 2.14E9;
    long double dip = 5.32E-5;
    printf("float val [%f] can write [%e]\n", aboat, aboat);
    printf("double val [%f] can write [%e]\n", abet, abet);
    printf("long double val [%LF] can write [%LE]\n", dip, dip);
}

void boolean(void)
{
    _Bool true = 1;
    _Bool false = 0;
    printf("_Bool size of %dbit\n", sizeof(true));
}

void transplant(void)
{
}

void data_type_size(void)
{
    printf("type _Bool size of [%d] bites\n", sizeof(_Bool));

    printf("type char size of [%d] bites\n", sizeof(char));
    printf("type int size of [%d] bites\n", sizeof(int));
    printf("type long size of [%d] bites\n", sizeof(long));
    printf("type short size of [%d] bites\n", sizeof(short));

    printf("type float size of [%d] bites\n", sizeof(float));
    printf("type double size of [%d] bites\n", sizeof(double));

    printf("type long long size of [%d] bites\n", sizeof(long long));
    printf("type long double size of [%d] bites\n", sizeof(long double));
}

/**
 * ------------ 数据类型 ------------
 * ------ 标准类型 ------
 * --- 整数类型 ---
 * 具体位数要根据实际机器的位数来确定
 * int 32位
 * long = long int 64位
 * short = short int 16位
 * unsigned 不带符号的整形
 * char
 * --- 浮点数类型 ---
 * float 32位
 * double 64位
 * ------ C90 ------
 * signed 带符号的整形
 * void
 * ------ C99 ------
 * _Bool 布尔类型, 只能是[0, 1]
 * _Complex 复数类型
 * _Imaginary 虚部的数据类型
 * ------------ 计算机存储方式 ------------
 * 位(bit) 可以存储0或1
 * 字节(byte) 一个字节等于8位(bit), 可以存储256(2^8)个01组合
 * 字(word) 计算机给定的自然存储单位, 与CPU位数相同
 * ------------ 可移植类型 ------------
 * #include <stdint.h>, #include <inttypes.h>
 * ------------ 刷新输出 ------------
 * 强制刷新输出 fflush(stdout);
 */
